package com.coolingme.mouseevent.core;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 被观察者的抽象
 *
 * @author wangyue
 * @date 2020-10-19 22:20
 */
public class EventContext {

    /**
     * 事件容器
     */
    protected Map<String, Event> eventMap = new HashMap<>();

    /**
     * 注册
     *
     * @param eventType 事件类型
     * @param target    观察者
     * @param callback  回调函数
     */
    private void addListener(String eventType, EventListener target, Method callback) {
        eventMap.put(eventType, new Event(target, callback));
    }

    /**
     * 注册，反射获取观察者的方法
     *
     * @param eventType 事件类型
     * @param target    观察者
     */
    public void addListener(String eventType, EventListener target) {
        try {
            // 事件类型触发的方法
            Method method = target.getClass().getMethod("on" + toUpperFirstCase(eventType), Event.class);
            this.addListener(eventType, target, method);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 首字母大写
     */
    private String toUpperFirstCase(String eventType) {
        char[] chars = eventType.toCharArray();
        chars[0] -= 32;
        return String.valueOf(chars);
    }

    /**
     * 事件触发执行的方法
     *
     * @param event 事件
     */
    private void trigger(Event event) {
        event.setSource(this);
        event.setTime(System.currentTimeMillis());

        if (event.getCallback() != null) {
            try {
                // 反射调用回调函数
                event.getCallback().invoke(event.getTarget(), event);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    protected void trigger(String trigger) {
        if (!this.eventMap.containsKey(trigger)) {
            System.out.println("======没有" + trigger + "事件======");
            return;
        }
        trigger(this.eventMap.get(trigger).setTrigger(trigger));
    }

}
